{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "id": "view-in-github"
   },
   "source": [
    "<a href=\"https://colab.research.google.com/github/CoreTheGreat/HBPU-Machine-Learning-Course/blob/main/ML_Chapter3_Classification.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "id": "lPboLx_o0UxI"
   },
   "source": [
    "# 第五章：深度学习\n",
    "湖北理工学院《机器学习》课程资料\n",
    "\n",
    "作者：李辉楚吴\n",
    "\n",
    "笔记内容概述: 前馈神经网络、全连接网络、手写字母识别"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 按照Classification章节，读取MNIST数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 1000
    },
    "id": "sM-ziKb94S9_",
    "outputId": "9a8bd59b-1ed4-47e3-e118-cee1849a610a"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test set size: 10000\n",
      "Training set size: 60000\n",
      "Number of training samples: 43360\n",
      "Number of cross-validation samples: 10850\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "label_size = 18 # Label size\n",
    "ticklabel_size = 14 # Tick label size\n",
    "\n",
    "class FlattenTransform:\n",
    "    def __call__(self, tensor):\n",
    "        ''' \n",
    "        Flatten tensor into an 1-D vector\n",
    "        '''\n",
    "        return tensor.view(-1)\n",
    "    \n",
    "# Define a transform to normalize the data\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(),\n",
    "    FlattenTransform()\n",
    "])\n",
    "\n",
    "# Load test data from the MNIST\n",
    "testset = torchvision.datasets.MNIST(root='./Data', train=False, download=False, transform=transform)\n",
    "print(f\"Test set size: {len(testset)}\")\n",
    "\n",
    "# Load training data from the MNIST\n",
    "trainset = torchvision.datasets.MNIST(root='./Data', train=True, download=False, transform=transform)\n",
    "print(f\"Training set size: {len(trainset)}\")\n",
    "\n",
    "# Rate of trX and cvX\n",
    "tr_cv_rate = 0.8\n",
    "\n",
    "# Create a list to store indices for each class\n",
    "class_indices = [[] for _ in range(10)]  # 10 classes in MNIST\n",
    "\n",
    "# Populate class_indices\n",
    "for idx, (_, label) in enumerate(trainset):\n",
    "    class_indices[label].append(idx)\n",
    "\n",
    "# Calculate the number of samples for each class in training and validation sets\n",
    "train_size_per_class = int(tr_cv_rate * min(len(indices) for indices in class_indices))\n",
    "val_size_per_class = min(len(indices) for indices in class_indices) - train_size_per_class\n",
    "\n",
    "# Create balanced train and validation sets\n",
    "train_indices = []\n",
    "val_indices = []\n",
    "for indices in class_indices:\n",
    "    train_indices.extend(indices[:train_size_per_class])\n",
    "    val_indices.extend(indices[train_size_per_class:train_size_per_class + val_size_per_class])\n",
    "\n",
    "# Create Subset datasets\n",
    "from torch.utils.data import Subset\n",
    "trX = Subset(trainset, train_indices)\n",
    "cvX = Subset(trainset, val_indices)\n",
    "\n",
    "print(f\"Number of training samples: {len(trX)}\")\n",
    "print(f\"Number of cross-validation samples: {len(cvX)}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "构建DataLoaders，准备训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/"
    },
    "id": "BWPSDyOq5qOO",
    "outputId": "9aed06f2-67a9-4a6f-f00c-d91554c3a260"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Input_size is 784\n",
      "tensor([[0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
      "        [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],\n",
      "        [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
      "        [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],\n",
      "        [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
      "        [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.],\n",
      "        [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
      "        [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
      "        [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
      "        [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
      "        [0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
      "        [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],\n",
      "        [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],\n",
      "        [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
      "        [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
      "        [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.],\n",
      "        [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],\n",
      "        [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],\n",
      "        [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.]])\n"
     ]
    }
   ],
   "source": [
    "batch_size = 42 # Define training batch\n",
    "\n",
    "def one_hot_collate(batch):\n",
    "    data = torch.stack([item[0] for item in batch])\n",
    "    labels = torch.tensor([item[1] for item in batch])\n",
    "    one_hot_labels = torch.zeros(labels.size(0), 10)  # 10 classes in MNIST\n",
    "    one_hot_labels.scatter_(1, labels.unsqueeze(1), 1)\n",
    "    return data, one_hot_labels\n",
    "\n",
    "trLoader = torch.utils.data.DataLoader(trX, batch_size=batch_size, shuffle=True, num_workers=0, collate_fn=one_hot_collate)\n",
    "cvLoader = torch.utils.data.DataLoader(cvX, batch_size=batch_size, shuffle=False, num_workers=0, collate_fn=one_hot_collate)\n",
    "teLoader = torch.utils.data.DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=0, collate_fn=one_hot_collate)\n",
    "\n",
    "# Get a batch of training data\n",
    "dataiter = iter(trLoader)\n",
    "data, labels = next(dataiter)\n",
    "\n",
    "input_size = data[0].numpy().shape[0]\n",
    "print(f'Input_size is {input_size}')\n",
    "print(labels)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 定义并训练全连接神经网络\n",
    "* 输入：1-D向量\n",
    "* 输出：手写字母类型的概率分布\n",
    "* 隐藏层：2层\n",
    "* 节点数：100个/层"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "FNN(\n",
      "  (fc1): Linear(in_features=784, out_features=10, bias=True)\n",
      "  (relu1): ReLU()\n",
      "  (fc2): Linear(in_features=10, out_features=10, bias=True)\n",
      "  (relu2): ReLU()\n",
      "  (fc3): Linear(in_features=10, out_features=10, bias=True)\n",
      "  (softmax): Softmax(dim=1)\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "import torch.nn as nn\n",
    "\n",
    "class FNN(nn.Module):\n",
    "    def __init__(self, input_size, hidden_size, num_classes):\n",
    "        super(FNN, self).__init__()\n",
    "        self.fc1 = nn.Linear(input_size, hidden_size)\n",
    "        self.relu1 = nn.ReLU()\n",
    "        self.fc2 = nn.Linear(hidden_size, hidden_size)\n",
    "        self.relu2 = nn.ReLU()\n",
    "        self.fc3 = nn.Linear(hidden_size, num_classes)\n",
    "        self.softmax = nn.Softmax(dim=1)\n",
    "    \n",
    "    def forward(self, x):\n",
    "        x = self.fc1(x)\n",
    "        x = self.relu1(x)\n",
    "        x = self.fc2(x)\n",
    "        x = self.relu2(x)\n",
    "        x = self.fc3(x)\n",
    "        out = self.softmax(x)\n",
    "        return out\n",
    "\n",
    "# Define the model parameters\n",
    "hidden_size = 10\n",
    "num_classes = 10  # MNIST has 10 classes (digits 0-9)\n",
    "\n",
    "# Instantiate the model\n",
    "model = FNN(input_size, hidden_size, num_classes)\n",
    "print(model)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用Adam作为Optimizor训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch [1/50], Train Loss: 1.5949, CV Loss: 1.6201\n",
      "Epoch [2/50], Train Loss: 1.5945, CV Loss: 1.6205\n",
      "Epoch [3/50], Train Loss: 1.5947, CV Loss: 1.6215\n",
      "Epoch [4/50], Train Loss: 1.5942, CV Loss: 1.6197\n",
      "Epoch [5/50], Train Loss: 1.5941, CV Loss: 1.6187\n",
      "Epoch [6/50], Train Loss: 1.5935, CV Loss: 1.6191\n",
      "Epoch [7/50], Train Loss: 1.5936, CV Loss: 1.6192\n",
      "Epoch [8/50], Train Loss: 1.5935, CV Loss: 1.6187\n",
      "Epoch [9/50], Train Loss: 1.5932, CV Loss: 1.6204\n",
      "Epoch [10/50], Train Loss: 1.5924, CV Loss: 1.6203\n",
      "Epoch [11/50], Train Loss: 1.5929, CV Loss: 1.6193\n",
      "Epoch [12/50], Train Loss: 1.5925, CV Loss: 1.6191\n",
      "Epoch [13/50], Train Loss: 1.5927, CV Loss: 1.6180\n",
      "Epoch [14/50], Train Loss: 1.5922, CV Loss: 1.6186\n",
      "Epoch [15/50], Train Loss: 1.5923, CV Loss: 1.6196\n",
      "Epoch [16/50], Train Loss: 1.5922, CV Loss: 1.6209\n",
      "Epoch [17/50], Train Loss: 1.5919, CV Loss: 1.6194\n",
      "Epoch [18/50], Train Loss: 1.5921, CV Loss: 1.6186\n",
      "Epoch [19/50], Train Loss: 1.5910, CV Loss: 1.6186\n",
      "Epoch [20/50], Train Loss: 1.5916, CV Loss: 1.6184\n",
      "Epoch [21/50], Train Loss: 1.5914, CV Loss: 1.6200\n",
      "Epoch [22/50], Train Loss: 1.5916, CV Loss: 1.6190\n",
      "Epoch [23/50], Train Loss: 1.5913, CV Loss: 1.6190\n",
      "Epoch [24/50], Train Loss: 1.5907, CV Loss: 1.6192\n",
      "Epoch [25/50], Train Loss: 1.5907, CV Loss: 1.6225\n",
      "Epoch [26/50], Train Loss: 1.5907, CV Loss: 1.6194\n",
      "Epoch [27/50], Train Loss: 1.5904, CV Loss: 1.6184\n",
      "Epoch [28/50], Train Loss: 1.5905, CV Loss: 1.6182\n",
      "Epoch [29/50], Train Loss: 1.5904, CV Loss: 1.6198\n",
      "Epoch [30/50], Train Loss: 1.5901, CV Loss: 1.6190\n",
      "Epoch [31/50], Train Loss: 1.5898, CV Loss: 1.6208\n",
      "Epoch [32/50], Train Loss: 1.5898, CV Loss: 1.6187\n",
      "Epoch [33/50], Train Loss: 1.5898, CV Loss: 1.6186\n",
      "Epoch [34/50], Train Loss: 1.5902, CV Loss: 1.6177\n",
      "Epoch [35/50], Train Loss: 1.5901, CV Loss: 1.6180\n",
      "Epoch [36/50], Train Loss: 1.5897, CV Loss: 1.6174\n",
      "Epoch [37/50], Train Loss: 1.5894, CV Loss: 1.6194\n",
      "Epoch [38/50], Train Loss: 1.5895, CV Loss: 1.6172\n",
      "Epoch [39/50], Train Loss: 1.5889, CV Loss: 1.6184\n",
      "Epoch [40/50], Train Loss: 1.5895, CV Loss: 1.6173\n",
      "Epoch [41/50], Train Loss: 1.5895, CV Loss: 1.6182\n",
      "Epoch [42/50], Train Loss: 1.5895, CV Loss: 1.6177\n",
      "Epoch [43/50], Train Loss: 1.5892, CV Loss: 1.6167\n",
      "Epoch [44/50], Train Loss: 1.5889, CV Loss: 1.6171\n",
      "Epoch [45/50], Train Loss: 1.5891, CV Loss: 1.6183\n",
      "Epoch [46/50], Train Loss: 1.5886, CV Loss: 1.6158\n",
      "Epoch [47/50], Train Loss: 1.5887, CV Loss: 1.6167\n",
      "Epoch [48/50], Train Loss: 1.5890, CV Loss: 1.6181\n",
      "Epoch [49/50], Train Loss: 1.5888, CV Loss: 1.6177\n",
      "Epoch [50/50], Train Loss: 1.5880, CV Loss: 1.6166\n"
     ]
    }
   ],
   "source": [
    "# Define loss function and optimizer\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = torch.optim.Adam(model.parameters())\n",
    "\n",
    "# Lists to store losses\n",
    "train_losses = []\n",
    "cv_losses = []\n",
    "\n",
    "# Number of epochs\n",
    "num_epochs = 50\n",
    "\n",
    "for epoch in range(num_epochs):\n",
    "    model.train()\n",
    "    batch_losses = []\n",
    "    \n",
    "    for batch_x, batch_y in trLoader:\n",
    "        # Forward pass\n",
    "        outputs = model(batch_x)\n",
    "        loss = criterion(outputs, batch_y)\n",
    "        \n",
    "        # Backward pass and optimize\n",
    "        optimizer.zero_grad()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "        \n",
    "        batch_losses.append(loss.item())\n",
    "    \n",
    "    # Calculate average training loss for this epoch\n",
    "    avg_train_loss = sum(batch_losses) / len(batch_losses)\n",
    "    train_losses.append(avg_train_loss)\n",
    "    \n",
    "    # Evaluate on cross-validation set\n",
    "    model.eval()\n",
    "    cv_batch_losses = []\n",
    "    with torch.no_grad():\n",
    "        for cv_x, cv_y in cvLoader:\n",
    "            cv_outputs = model(cv_x)\n",
    "            cv_loss = criterion(cv_outputs, cv_y)\n",
    "            cv_batch_losses.append(cv_loss.item())\n",
    "    \n",
    "    avg_cv_loss = sum(cv_batch_losses) / len(cv_batch_losses)\n",
    "    cv_losses.append(avg_cv_loss)\n",
    "    \n",
    "    print(f'Epoch [{epoch+1}/{num_epochs}], Train Loss: {avg_train_loss:.4f}, CV Loss: {avg_cv_loss:.4f}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "计算识别精度，展示学习曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy on training set: 87.31%\n",
      "Accuracy on cross-validation set: 84.63%\n"
     ]
    },
    {
     "data": {
      "image/png": "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8gnNmjUDCu75siyL3r17s3DhQkaMGEG7du34559/eOWVV1i1ahWrVq3C09PTsf+F/I2cT1paGh07dmTXrl28+uqrNGrUiGXLljFq1CiioqL47bffADNUecCAAQwYMICRI0fi5eXF3r17c/3sR48ezciRI3nxxRe5/vrryczMZOvWrXlCpYhchSwRESnQ4MGDLV9f31zb2rdvbwHWwoULz3lsdna2lZmZaS1ZssQCrA0bNjgee+WVV6yz/wmOjIy0vLy8rL179zq2paamWuXKlbPuv/9+x7Y//vjDAqw//vgjVzsB6/vvv891zh49eli1a9d23P/kk08swPr9999z7Xf//fdbgDVx4sRzvqazZWVlWZmZmVanTp2sW2+91bF99+7dFmA1bNjQysrKcmz/888/LcCaOnWqZVmWZbfbrYoVK1rNmjWzsrOzHfvt2bPHcnd3tyIjI8/5/G+//bYFWHPmzClUe3N+dtdff32u7cePH7e8vb2tHj165NoeExNjeXp6WgMHDrQsy7Li4uIswBo7dmyBz/Hjjz9agBUVFVWoNuXXvjFjxji2xcfHW56entadd96Z7zFFfZ+1b9/eat++veP++PHjLcD6+eefc+133333nfc9kZWVZSUlJVm+vr7Whx9+6Nj+ww8/5HmP5hg8eHCu3+ucOXMswBo9enSu/aZNm2YB1ueff+7YVti/kYIA1sMPP1zg459++mm+f0fvvPOOBVjz5s2zLMuy3nvvPQuwTpw4UeC5br75ZqtJkybnbZOIXH00BFFEpBjKli3LDTfckGd7dHQ0AwcOJDQ0FFdXV9zd3Wnfvj1AnqFs+WnSpAkRERGO+15eXtSqVSvXEK+C2Gw2evbsmWtbo0aNch27ZMkS/P398xQAueOOO857/hyffvopzZo1w8vLCzc3N9zd3Vm4cGG+r++mm27KVVAiZyhgTpu2bdvGwYMHGThwYK4hmZGRkbRp06bQbSqqvn375rq/atUqUlNTGTJkSK7tlStX5oYbbmDhwoUAlCtXjurVq/Puu+8yZswY/v777zwVFps0aYKHhwf/+c9/+Prrr4mOjs7z/Ha7naysLMcl5xzt27enevXquYYhfvvtt6Snp+ca3nah77Mz/fHHH/j7+3PLLbfk2p7T23ampKQknn32WWrUqIGbmxtubm74+fmRnJxc5OfNkdNrdPbP/rbbbsPX19fxs89xIX8jhWmLr68v/fr1y7U9p205bbnmmmsA6N+/P99//z0HDhzIc66WLVuyYcMGHnroIebOnUtiYuIFt09ErgwKYCIixRAWFpZnW1JSEu3atWPNmjW88cYbLF68mLVr1/LTTz8BnLMQRI6goKA82zw9PQt1rI+PD15eXnmOTUtLc9yPj48nJCQkz7H5bcvPmDFjePDBB2nVqhXTp09n9erVrF27lm7duuXbxrNfT85Qspx94+PjAQgNDc1zbH7bzpbzQXz37t2Fan+Os39/Oe3I7/dasWJFx+M2m42FCxfStWtXRo8eTbNmzQgODua///0vJ0+eBMxQuwULFlChQgUefvhhqlevTvXq1XPN/enUqRPu7u6OS064stls3HPPPWzcuJF169YBZvhh1apV6dixI1Ay77OzX3t+v//8fv4DBw7k448/5t5772Xu3Ln8+eefrF27luDg4CI/75nP7+bmlmvIJZifRWhoqONnn+NC/kYK05bQ0NA88zMrVKiAm5uboy3XX389M2fOJCsri0GDBlGpUiUaNGjA1KlTHceMGDGC9957j9WrV9O9e3eCgoLo1KmT4/cqIlcvzQETESmG/NbwWrRoEQcPHmTx4sWO3gjgkprzERQUxJ9//plne34FF/LzzTff0KFDB8aPH59re074KE57Cnr+wrSpY8eOuLu7M3PmTB544IFCP+/Zv7+cdsTGxubZ9+DBg5QvX95xPzIykq+++gqA7du38/333zNy5EgyMjL49NNPAWjXrh3t2rXDbrezbt06/u///o/hw4cTEhLC7bffzmeffZbrZ3bm+YcMGcLLL7/MhAkTcHd35++//+b11193tLmk32eFfU8kJCTw66+/8sorr+Raryw9Pd0xN7C4z5+VlZVn3ptlWRw6dMjR2+QMQUFBrFmzBsuycr1Hjhw5QlZWVq7fU69evejVqxfp6emsXr2aUaNGMXDgQKpUqULr1q1xc3PjiSee4IknnuDEiRMsWLCA559/nq5du7Jv374iVU0VkSuLesBEREpIzge2MwsGAHz22Wel0Zx8tW/fnpMnT/L777/n2v7dd98V6nibzZbn9f3zzz951k8rrNq1axMWFsbUqVOxLMuxfe/evaxcufK8x4eGhjp6YwqqnLhr1y7++eefc56ndevWeHt788033+Tavn//fhYtWkSnTp3yPa5WrVq8+OKLNGzYkPXr1+d53NXVlVatWvHJJ58AOPapXbs2LVq0cFzOrApYsWJFunXrxtSpU/nkk09wcXFh8ODBjsdL+n3WsWNHTp48yaxZs3Jt/9///pfrvs1mw7KsPM/75ZdfYrfbc207u6fzXHJ+tmf/7KdPn05ycnKBP/uLoVOnTiQlJTFz5sxc23PeW/m1xdPTk/bt2/POO+8A8Pfff+fZJzAwkH79+vHwww9z7NixfBeoFpGrh3rARERKSJs2bShbtiwPPPAAr7zyCu7u7nz77bds2LChtJvmMHjwYD744APuuusu3njjDWrUqMHvv//O3LlzAc5bdfDmm2/m9ddf55VXXqF9+/Zs27aN1157japVq5KVlVXk9ri4uPD6669z7733cuutt3Lfffdx4sQJRo4cWaghiGCGRUZHRzNkyBDmzp3LrbfeSkhICHFxccyfP5+JEyfy3XffOeaf5ScwMJCXXnqJ559/nkGDBnHHHXcQHx/Pq6++ipeXF6+88gpgwuYjjzzCbbfdRs2aNfHw8GDRokX8888/jl6hTz/9lEWLFnHTTTcRERFBWlqao0x6586dC/Wahg0bxm+//eYosV+5cmXHYyX9Phs0aBAffPABgwYN4s0336RmzZrMnj3b8Z7IUaZMGa6//nreffddypcvT5UqVViyZAlfffUVgYGBufZt0KABAJ9//jn+/v54eXlRtWrVfIcP3njjjXTt2pVnn32WxMRE2rZt66iC2LRpU+6+++5iva6C7Nq1ix9//DHP9nr16jFo0CA++eQTBg8ezJ49e2jYsCHLly/nrbfeokePHo7f38svv8z+/fvp1KkTlSpV4sSJE3z44Ye55uL17NmTBg0a0KJFC4KDg9m7dy9jx44lMjLSUVFTRK5SpVsDRETk0lZQFcT69evnu//KlSut1q1bWz4+PlZwcLB17733WuvXr89TTa6gKog33XRTnnOeXbWuoCqIZ7ezoOeJiYmx+vTpY/n5+Vn+/v5W3759rdmzZ+dbCe9s6enp1lNPPWWFh4dbXl5eVrNmzayZM2fmqWyXUwXx3XffzXMOwHrllVdybfvyyy+tmjVrWh4eHlatWrWsCRMm5DnnuWRlZVlff/21dcMNN1jlypWz3NzcrODgYKt79+7W//73P8tut1uWdfpn98MPP+R7ni+//NJq1KiR5eHhYQUEBFi9evWy/v33X8fjhw8ftoYMGWLVqVPH8vX1tfz8/KxGjRpZH3zwgaPa46pVq6xbb73VioyMtDw9Pa2goCCrffv21qxZswr1WizLsjIyMqyQkJB8K/JZ1oW9z85+P1mWZe3fv9/q27dvrvfEypUr85wvZ7+yZcta/v7+Vrdu3axNmzZZkZGR1uDBg3Odc+zYsVbVqlUtV1fXXOfJ7/eamppqPfvss1ZkZKTl7u5uhYWFWQ8++KB1/PjxXPsV9m+kIECBl5z3ZHx8vPXAAw9YYWFhlpubmxUZGWmNGDHCSktLc5zn119/tbp3726Fh4dbHh4eVoUKFawePXpYy5Ytc+zz/vvvW23atLHKly9veXh4WBEREdawYcOsPXv2nLedInJls1nWGWM+RETkqvTWW2/x4osvEhMTQ6VKlUq7OSIiIlcsDUEUEbnKfPzxxwDUqVOHzMxMFi1axEcffcRdd92l8CUiInKRKYCJiFxlfHx8+OCDD9izZw/p6elERETw7LPP8uKLL5Z200RERK54GoIoIiIiIiLiJCpDLyIiIiIi4iQKYCIiIiIiIk6iACYiIiIiIuIkKsJRTNnZ2Rw8eBB/f39sNltpN0dEREREREqJZVmcPHmSihUr4uJy7j4uBbBiOnjwIJUrVy7tZoiIiIiIyCVi3759513SRQGsmPz9/QHzQy5Tpkwpt0ZEREREREpLYmIilStXdmSEc1EAK6acYYdlypRRABMRERERkUJNTVIRDhERERERESdRABMREREREXESBTAREREREREn0RwwERERETkvu91OZmZmaTdDpFS4urri5uZWIstPKYCJiIiIyDklJSWxf/9+LMsq7aaIlBofHx/CwsLw8PC4oPMogImIiIhIgex2O/v378fHx4fg4OAS6QEQuZxYlkVGRgZHjx5l9+7d1KxZ87yLLZ+LApiIiIiIFCgzMxPLsggODsbb27u0myNSKry9vXF3d2fv3r1kZGTg5eVV7HOpCIeIiIiInJd6vuRqdyG9XrnOUyJnERERERERkfNSABMREREREXESBTARERERkULo0KEDw4cPL/T+e/bswWazERUVddHaJJcfBTARERERuaLYbLZzXoYMGVKs8/7000+8/vrrhd6/cuXKxMbG0qBBg2I9X2Ep6F1eVAVRRERERK4osbGxjtvTpk3j5ZdfZtu2bY5tZ1dzzMzMxN3d/bznLVeuXJHa4erqSmhoaJGOkSufesBERETOJWYNfH0LHNpU2i0RuSRYlkVKRlapXAq7EHRoaKjjEhAQgM1mc9xPS0sjMDCQ77//ng4dOuDl5cU333xDfHw8d9xxB5UqVcLHx4eGDRsyderUXOc9ewhilSpVeOutt7jnnnvw9/cnIiKCzz//3PH42T1TixcvxmazsXDhQlq0aIGPjw9t2rTJFQ4B3njjDSpUqIC/vz/33nsvzz33HE2aNCnW7wsgPT2d//73v1SoUAEvLy+uu+461q5d63j8+PHj3HnnnY6lBmrWrMnEiRMByMjI4JFHHiEsLAwvLy+qVKnCqFGjit0WUQ+YiIhIwSwL5jwLB/+GuSNg8C+l3SKRUpeaaafey3NL5bk3v9YVH4+S+fj67LPP8v777zNx4kQ8PT1JS0ujefPmPPvss5QpU4bffvuNu+++m2rVqtGqVasCz/P+++/z+uuv8/zzz/Pjjz/y4IMPcv3111OnTp0Cj3nhhRd4//33CQ4O5oEHHuCee+5hxYoVAHz77be8+eabjBs3jrZt2/Ldd9/x/vvvU7Vq1WK/1meeeYbp06fz9ddfExkZyejRo+natSs7d+6kXLlyvPTSS2zevJnff/+d8uXLs3PnTlJTUwH46KOPmDVrFt9//z0RERHs27ePffv2FbstogAmIiJSsP3rTPgC2L0UDqyH8Gal2yYRKRHDhw+nT58+ubY99dRTjtuPPvooc+bM4YcffjhnAOvRowcPPfQQYELdBx98wOLFi88ZwN58803at28PwHPPPcdNN91EWloaXl5e/N///R/Dhg1j6NChALz88svMmzePpKSkYr3O5ORkxo8fz6RJk+jevTsAX3zxBfPnz+err77i6aefJiYmhqZNm9KiRQvA9OzliImJoWbNmlx33XXYbDYiIyOL1Q45TQFMRESkIGs+NdcubpCdBSs+hP5fl26bREqZt7srm1/rWmrPXVJywkYOu93O22+/zbRp0zhw4ADp6emkp6fj6+t7zvM0atTIcTtnqOORI0cKfUxYWBgAR44cISIigm3btjkCXY6WLVuyaNGiQr2us+3atYvMzEzatm3r2Obu7k7Lli3ZsmULAA8++CB9+/Zl/fr1dOnShd69e9OmTRsAhgwZwo033kjt2rXp1q0bN998M126dClWW8TQHDAREZH8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MmHCBLZs2cLjjz9OTEwMDzzwgPNevIiIiIiIXHVKtQz94sWL6dixY57tgwcPZtKkSQwZMoQ9e/awePFix2Nbt27l0UcfZcWKFQQFBdG/f3/eeOMNRwDbs2cPVatWzXPO9u3b5zrPuHHjGD16NLGxsTRo0IAPPviA66+/vtBtVxl6ERERERGBomWDS2YdsMuNApiIiIiIiMAVvA6YiIiIiIjI5UwBTERERERExEkUwERERERERJxEAUxERERERMRJFMBEREREREScRAFMRERERETESRTAREREREREnEQBTERERERExEkUwERERERERJxEAUxERERERMRJFMBEREREREScRAFMRERERETESRTAREREREREnEQBTERERERExEkUwERERERERJxEAUxERERERMRJFMBEREREREScRAFMRERERETESRTAREREREREnEQBTERERERExEkUwERERERERJxEAUxERERERMRJFMBEREREREScRAFMRERERETESRTAREREREREnEQBTERERERExEkUwERERERERJxEAUxERERERMRJFMBEREREREScRAFMRERERETESYoVwPbt28f+/fsd9//880+GDx/O559/XmINExERERERudIUK4ANHDiQP/74A4BDhw5x44038ueff/L888/z2muvlWgDRURERERErhTFCmCbNm2iZcuWAHz//fc0aNCAlStX8r///Y9JkyaVZPtERERERESuGMUKYJmZmXh6egKwYMECbrnlFgDq1KlDbGxsybVORERERETkClKsAFa/fn0+/fRTli1bxvz58+nWrRsABw8eJCgoqEQbKCIiIiIicqUoVgB75513+Oyzz+jQoQN33HEHjRs3BmDWrFmOoYkiIiIiIiKSm82yLKs4B9rtdhITEylbtqxj2549e/Dx8aFChQol1sBLVWJiIgEBASQkJFCmTJnSbo6IiIiIiJSSomSDYvWApaamkp6e7ghfe/fuZezYsWzbtu2qCF8iIiIiIiLFUawA1qtXLyZPngzAiRMnaNWqFe+//z69e/dm/PjxJdpAERERERGRK0WxAtj69etp164dAD/++CMhISHs3buXyZMn89FHH5VoA0VERERERK4UxQpgKSkp+Pv7AzBv3jz69OmDi4sL1157LXv37i30eZYuXUrPnj2pWLEiNpuNmTNnnveY9PR0Xnjh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f3/WrFnj2GfatGkMHz6cF154gb///pt27drRvXt3YmJiSvT1iYiIiIiInMlmWZZV2o0AsNlszJgxg969exe4z5w5c7j99tuJjo6mXLly+e4zYMAAEhMT+f333x3bunXrRtmyZZk6dSoArVq1olmzZowfP96xT926denduzejRo0qVHsTExMJCAggISGBMmXKFOoYERERERG58hQlG1xWc8BmzZpFixYtGD16NOHh4dSqVYunnnqK1NRUxz6rVq2iS5cuuY7r2rUrK1euBCAjI4O//vorzz5dunRx7JOf9PR0EhMTc11ERERERESKwq20G1AU0dHRLF++HC8vL2bMmEFcXBwPPfQQx44dc8wDO3ToECEhIbmOCwkJ4dChQwDExcVht9vPuU9+Ro0axauvvlrCr0hERERERK4ml1UPWHZ2NjabjW+//ZaWLVvSo0cPxowZw6RJk3L1gtlstlzHWZaVZ1th9jnTiBEjSEhIcFz27dtXAq9IRERERESuJpdVD1hYWBjh4eEEBAQ4ttWtWxfLsti/fz81a9YkNDQ0T0/WkSNHHD1e5cuXx9XV9Zz75MfT0xNPT88SfDUiIiIiInK1uax6wNq2bcvBgwdJSkpybNu+fTsuLi5UqlQJgNatWzN//vxcx82bN482bdoA4OHhQfPmzfPsM3/+fMc+IiIiIiIiF0OpBrCkpCSioqKIiooCYPfu3URFRTnKwY8YMYJBgwY59h84cCBBQUEMHTqUzZs3s3TpUp5++mnuuecevL29AXjssceYN28e77zzDlu3buWdd95hwYIFDB8+3HGeJ554gi+//JIJEyawZcsWHn/8cWJiYnjggQec9tpFREREROTqU6pDENetW0fHjh0d95944gkABg8ezKRJk4iNjc21Npefnx/z58/n0UcfpUWLFgQFBdG/f3/eeOMNxz5t2rThu+++48UXX+Sll16ievXqTJs2jVatWjn2GTBgAPHx8bz22mvExsbSoEEDZs+eTWRkpBNetYiIiIiIXK0umXXALjdaB0xEREREROAKXgdMRERERETkcqYAJiIiIiIi4iQKYCIiIiIiIk6iACYiIiIiIuIkCmAiIiIiIiJOogAmIiIiIiLiJApgIiIiIiIiTqIAJiIiIiIi4iQKYCIiIiIiIk6iACYiIiIiIuIkCmAiIiIiIiJOogAmIiIiIiLiJApg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",
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Calculate and print accuracies for training and cross-validation sets\n",
    "model.eval()\n",
    "with torch.no_grad():\n",
    "    # Training set accuracy\n",
    "    tr_correct = 0\n",
    "    tr_total = 0\n",
    "    for images, labels in trLoader:\n",
    "        outputs = model(images)\n",
    "        _, predicted = torch.max(outputs, 1)\n",
    "        _, true_labels = torch.max(labels, 1)\n",
    "        tr_total += labels.size(0)\n",
    "        tr_correct += (predicted == true_labels).sum().item()\n",
    "    \n",
    "    tr_accuracy = 100 * tr_correct / tr_total\n",
    "    \n",
    "    # Cross-validation set accuracy\n",
    "    cv_correct = 0\n",
    "    cv_total = 0\n",
    "    for images, labels in cvLoader:\n",
    "        outputs = model(images)\n",
    "        _, predicted = torch.max(outputs, 1)\n",
    "        _, true_labels = torch.max(labels, 1)\n",
    "        cv_total += labels.size(0)\n",
    "        cv_correct += (predicted == true_labels).sum().item()\n",
    "    \n",
    "    cv_accuracy = 100 * cv_correct / cv_total\n",
    "\n",
    "print(f'Accuracy on training set: {tr_accuracy:.2f}%')\n",
    "print(f'Accuracy on cross-validation set: {cv_accuracy:.2f}%')\n",
    "\n",
    "# Plot training and cross-validation losses\n",
    "plt.figure(figsize=(10, 5))\n",
    "plt.plot(range(1, num_epochs+1), train_losses, label='Training Loss')\n",
    "plt.plot(range(1, num_epochs+1), cv_losses, label='Cross-Validation Loss')\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('Loss')\n",
    "plt.title('Training and Cross-Validation Loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "colab": {
   "authorship_tag": "ABX9TyO5gS9/MePw+FDiXJA07L6y",
   "include_colab_link": true,
   "provenance": []
  },
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
